#include "Cerdito.h"

using namespace TP::Juego::Arena::Utilidades;

Cerdito::Cerdito() {
	_rol = new Rol(ROL_CERDITO, DESC_UTILIDAD);
	_vida = VIDA_CERDITO;
	_canasta = new Canasta();
	_catapulta = new Catapulta();
	_propietario = NULL;
	setEsEnemigo(false);
}

Cerdito::~Cerdito() {
	delete _canasta;
	delete _catapulta;
}

Utilidad* Cerdito::clonar() {
	Utilidad *copia = new Cerdito;
	if (_posicion != NULL) {
		copia->setPosicion(_posicion->clonar());
	}
	return copia;
}

IColisionado* Cerdito::colisionar(IColisionado* pColisionado) {
	//@todo: Implementar Cerdito.Colisionar.
}

Jugador* Cerdito::setPropietario(Jugador* pPropietario) throw (Excepcion&) {
	this->_propietario = pPropietario;
	return this->_propietario;
}

Jugador* Cerdito::getPropietario() {
	return this->_propietario;
}

Catapulta* Cerdito::getCatapulta() throw (Excepcion&) {
	if (NULL == this->_catapulta)
		throw Excepcion("El cerdito no posee una catapulta definida.");

	return this->_catapulta;
}

Canasta* Cerdito::getCanasta() throw (Excepcion&) {
	if (NULL == this->_canasta)
		throw Excepcion("El cerdito no posee una canasta definida.");

	return this->_canasta;
}

Posicion* Cerdito::setPosicion(Posicion* pPosicion) {
	// Configuro la posicion especificada.
	Utilidad::setPosicion(pPosicion);

	// Configuro la posicion de la catapulta.
	this->_catapulta->setPosicion(new Posicion(pPosicion->X() + OFF_SET_POS,
			pPosicion->Y()));

	// Configuro la posicion de ataque en la canasta.
	Posicion *aux = new Posicion();
	aux->deElementoXML(this->getCatapulta()->getPosicion()->aElementoXML());
	this->_canasta->setPosicionAtaque(aux);
}

TiXmlElement* Cerdito::aElementoXML() {
	TiXmlElement * element = new TiXmlElement(_rol->Nombre().c_str());

	// Serializo los atributos de tipo nativo.
	element->SetDoubleAttribute("vida", _vida);

	// Serializo la posicion.
	if (NULL != this->_posicion)
		element->LinkEndChild(this->getPosicion()->aElementoXML());
	else
		element->LinkEndChild(new TiXmlElement("NULL"));

	// Serializo el propietario.
	if (NULL != this->_propietario)
		element->LinkEndChild(this->_propietario->aElementoXML());
	else
		element->LinkEndChild(new TiXmlElement("NULL"));

	// Serializo la catapulta.
	if (NULL != this->_catapulta)
		element->LinkEndChild(this->_catapulta->aElementoXML());
	else
		element->LinkEndChild(new TiXmlElement("NULL"));

	// Serrializo la canasta.
	if (NULL != this->_canasta)
		element->LinkEndChild(this->_canasta->aElementoXML());
	else
		element->LinkEndChild(new TiXmlElement("NULL"));

	return element;
}

void Cerdito::deElementoXML(TiXmlElement* pElemento) {
	if (strcmp(pElemento->Value(), _rol->Nombre().c_str()) == 0) {

		// Hidrato las propiedades de tipo nativo.
		pElemento->Attribute("vida", &_vida);
		//pElemento->Attribute("puntaje", &_puntaje);

		// Hidrato la posicion.
		this->_posicion = NULL;
		if ("NULL" != pElemento->FirstChildElement()->ValueTStr()) {
			this->_posicion = new Posicion();
			this->getPosicion()->deElementoXML(pElemento->FirstChildElement());
		}

		// Hidrato al propietario del chanchito.
		this->_propietario = NULL;
		if ("NULL" != pElemento->FirstChildElement()->NextSiblingElement(
				)->ValueTStr()) {
			this->_propietario = new Jugador();
			this->_propietario->deElementoXML(pElemento->FirstChildElement(
					)->NextSiblingElement());
		}

		// Hidrato la catapulta.
		this->_catapulta = NULL;
		if ("NULL" != pElemento->FirstChildElement()->NextSiblingElement(
				)->NextSiblingElement()->ValueTStr()) {
			this->_catapulta = new Catapulta();
			this->_catapulta->deElementoXML(pElemento->FirstChildElement(
					)->NextSiblingElement()->NextSiblingElement());
		}

		// Hidrato la canasta.
		this->_canasta = NULL;
		if ("NULL" != pElemento->FirstChildElement()->NextSiblingElement(
				)->NextSiblingElement()->NextSiblingElement()->ValueTStr()) {
			this->_canasta = new Canasta();
			this->_canasta->deElementoXML(pElemento->FirstChildElement(
					)->NextSiblingElement()->NextSiblingElement(
					)->NextSiblingElement());
		}
	}
}

double Cerdito::getRadio() {
	return radio_cerdito;
}

int Cerdito::getPuntosDestruccion() {
	return PUNTAJE_CERDITO;
}